{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](http://osloyi5le.bkt.clouddn.com/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%B7%A5%E7%A8%8B%E5%B8%88banner.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 逻辑斯特回归示例\n",
    "\n",
    "- [逻辑斯特回归](#逻辑斯特回归)\n",
    "- [正则化后的逻辑斯特回归](#加正则化项的逻辑斯特回归)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Library/Python/2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n",
      "  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n",
      "/Library/Python/2.7/site-packages/IPython/html.py:14: ShimWarning: The `IPython.html` package has been deprecated. You should import from `notebook` instead. `IPython.html.widgets` has moved to `ipywidgets`.\n",
      "  \"`IPython.html.widgets` has moved to `ipywidgets`.\", ShimWarning)\n"
     ]
    }
   ],
   "source": [
    "# %load ../../standard_import.txt\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from scipy.optimize import minimize\n",
    "\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "\n",
    "pd.set_option('display.notebook_repr_html', False)\n",
    "pd.set_option('display.max_columns', None)\n",
    "pd.set_option('display.max_rows', 150)\n",
    "pd.set_option('display.max_seq_items', None)\n",
    " \n",
    "#%config InlineBackend.figure_formats = {'pdf',}\n",
    "%matplotlib inline\n",
    "\n",
    "import seaborn as sns\n",
    "sns.set_context('notebook')\n",
    "sns.set_style('white')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def loaddata(file, delimeter):\n",
    "    data = np.loadtxt(file, delimiter=delimeter)\n",
    "    print('Dimensions: ',data.shape)\n",
    "    print(data[1:6,:])\n",
    "    return(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plotData(data, label_x, label_y, label_pos, label_neg, axes=None):\n",
    "    # 获得正负样本的下标(即哪些是正样本，哪些是负样本)\n",
    "    neg = data[:,2] == 0\n",
    "    pos = data[:,2] == 1\n",
    "    \n",
    "    if axes == None:\n",
    "        axes = plt.gca()\n",
    "    axes.scatter(data[pos][:,0], data[pos][:,1], marker='+', c='k', s=60, linewidth=2, label=label_pos)\n",
    "    axes.scatter(data[neg][:,0], data[neg][:,1], c='y', s=60, label=label_neg)\n",
    "    axes.set_xlabel(label_x)\n",
    "    axes.set_ylabel(label_y)\n",
    "    axes.legend(frameon= True, fancybox = True);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 逻辑斯特回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Dimensions: ', (100, 3))\n",
      "[[ 30.28671077  43.89499752   0.        ]\n",
      " [ 35.84740877  72.90219803   0.        ]\n",
      " [ 60.18259939  86.3085521    1.        ]\n",
      " [ 79.03273605  75.34437644   1.        ]\n",
      " [ 45.08327748  56.31637178   0.        ]]\n"
     ]
    }
   ],
   "source": [
    "data = loaddata('data1.txt', ',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.c_[np.ones((data.shape[0],1)), data[:,0:2]]\n",
    "y = np.c_[data[:,2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x110c61210>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotData(data, 'Exam 1 score', 'Exam 2 score', 'Pass', 'Fail')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 逻辑斯特回归假设\n",
    "#### $$ h_{\\theta}(x) = g(\\theta^{T}x)$$\n",
    "#### $$ g(z)=\\frac{1}{1+e^{−z}} $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#定义sigmoid函数\n",
    "def sigmoid(z):\n",
    "    return(1 / (1 + np.exp(-z)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "其实scipy包里有一个函数可以完成一样的功能:<BR>\n",
    "http://docs.scipy.org/doc/scipy/reference/generated/scipy.special.expit.html#scipy.special.expit"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 损失函数\n",
    "#### $$ J(\\theta) = \\frac{1}{m}\\sum_{i=1}^{m}\\big[-y^{(i)}\\, log\\,( h_\\theta\\,(x^{(i)}))-(1-y^{(i)})\\,log\\,(1-h_\\theta(x^{(i)}))\\big]$$\n",
    "#### 向量化的损失函数(矩阵形式)\n",
    "#### $$ J(\\theta) = \\frac{1}{m}\\big((\\,log\\,(g(X\\theta))^Ty+(\\,log\\,(1-g(X\\theta))^T(1-y)\\big)$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "#定义损失函数\n",
    "def costFunction(theta, X, y):\n",
    "    m = y.size\n",
    "    h = sigmoid(X.dot(theta))\n",
    "    \n",
    "    J = -1.0*(1.0/m)*(np.log(h).T.dot(y)+np.log(1-h).T.dot(1-y))\n",
    "               \n",
    "    if np.isnan(J[0]):\n",
    "        return(np.inf)\n",
    "    return J[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 求偏导(梯度)\n",
    "\n",
    "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m}\\sum_{i=1}^{m} ( h_\\theta (x^{(i)})-y^{(i)})x^{(i)}_{j} $$ \n",
    "#### 向量化的偏导(梯度)\n",
    "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m} X^T(g(X\\theta)-y)$$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "#求解梯度\n",
    "def gradient(theta, X, y):\n",
    "    m = y.size\n",
    "    h = sigmoid(X.dot(theta.reshape(-1,1)))\n",
    "    \n",
    "    grad =(1.0/m)*X.T.dot(h-y)\n",
    "\n",
    "    return(grad.flatten())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Cost: \\n', 0.69314718055994518)\n",
      "('Grad: \\n', array([ -0.1       , -12.00921659, -11.26284221]))\n"
     ]
    }
   ],
   "source": [
    "initial_theta = np.zeros(X.shape[1])\n",
    "cost = costFunction(initial_theta, X, y)\n",
    "grad = gradient(initial_theta, X, y)\n",
    "print('Cost: \\n', cost)\n",
    "print('Grad: \\n', grad)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 最小化损失函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   status: 0\n",
       "  success: True\n",
       "     njev: 28\n",
       "     nfev: 28\n",
       " hess_inv: array([[  3.24739469e+03,  -2.59380769e+01,  -2.63469561e+01],\n",
       "       [ -2.59380769e+01,   2.21449124e-01,   1.97772068e-01],\n",
       "       [ -2.63469561e+01,   1.97772068e-01,   2.29018831e-01]])\n",
       "      fun: 0.20349770158944075\n",
       "        x: array([-25.16133401,   0.20623172,   0.2014716 ])\n",
       "  message: 'Optimization terminated successfully.'\n",
       "      jac: array([ -2.73305312e-10,   1.43144026e-07,  -1.58965802e-07])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res = minimize(costFunction, initial_theta, args=(X,y), jac=gradient, options={'maxiter':400})\n",
    "res"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 做一下预测吧"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def predict(theta, X, threshold=0.5):\n",
    "    p = sigmoid(X.dot(theta.T)) >= threshold\n",
    "    return(p.astype('int'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 咱们来看看考试1得分45，考试2得分85的同学通过概率有多高"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.77629066133254787"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sigmoid(np.array([1, 45, 85]).dot(res.x.T))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 画决策边界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1124007d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(45, 85, s=60, c='r', marker='v', label='(45, 85)')\n",
    "plotData(data, 'Exam 1 score', 'Exam 2 score', 'Admitted', 'Not admitted')\n",
    "x1_min, x1_max = X[:,1].min(), X[:,1].max(),\n",
    "x2_min, x2_max = X[:,2].min(), X[:,2].max(),\n",
    "xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))\n",
    "h = sigmoid(np.c_[np.ones((xx1.ravel().shape[0],1)), xx1.ravel(), xx2.ravel()].dot(res.x))\n",
    "h = h.reshape(xx1.shape)\n",
    "plt.contour(xx1, xx2, h, [0.5], linewidths=1, colors='b');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 加正则化项的逻辑斯特回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Dimensions: ', (118, 3))\n",
      "[[-0.092742  0.68494   1.      ]\n",
      " [-0.21371   0.69225   1.      ]\n",
      " [-0.375     0.50219   1.      ]\n",
      " [-0.51325   0.46564   1.      ]\n",
      " [-0.52477   0.2098    1.      ]]\n"
     ]
    }
   ],
   "source": [
    "data2 = loaddata('data2.txt', ',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 拿到X和y\n",
    "y = np.c_[data2[:,2]]\n",
    "X = data2[:,0:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n3FwqnMw2R1QAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x114ebbf50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画个图\n",
    "plotData(data2, 'Microchip Test 1', 'Microchip Test 2', 'y = 1', 'y = 0')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 咱们整一点多项式特征出来(最高6阶)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(118, 28)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly = PolynomialFeatures(6)\n",
    "XX = poly.fit_transform(data2[:,0:2])\n",
    "# 看看形状(特征映射后x有多少维了)\n",
    "XX.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 正则化后损失函数\n",
    "#### $$ J(\\theta) = \\frac{1}{m}\\sum_{i=1}^{m}\\big[-y^{(i)}\\, log\\,( h_\\theta\\,(x^{(i)}))-(1-y^{(i)})\\,log\\,(1-h_\\theta(x^{(i)}))\\big] + \\frac{\\lambda}{2m}\\sum_{j=1}^{n}\\theta_{j}^{2}$$\n",
    "#### 向量化的损失函数(矩阵形式)\n",
    "#### $$ J(\\theta) = \\frac{1}{m}\\big((\\,log\\,(g(X\\theta))^Ty+(\\,log\\,(1-g(X\\theta))^T(1-y)\\big) + \\frac{\\lambda}{2m}\\sum_{j=1}^{n}\\theta_{j}^{2}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 定义损失函数\n",
    "def costFunctionReg(theta, reg, *args):\n",
    "    m = y.size\n",
    "    h = sigmoid(XX.dot(theta))\n",
    "    \n",
    "    J = -1.0*(1.0/m)*(np.log(h).T.dot(y)+np.log(1-h).T.dot(1-y)) + (reg/(2.0*m))*np.sum(np.square(theta[1:]))\n",
    "    \n",
    "    if np.isnan(J[0]):\n",
    "        return(np.inf)\n",
    "    return(J[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 偏导(梯度)\n",
    "\n",
    "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m}\\sum_{i=1}^{m} ( h_\\theta (x^{(i)})-y^{(i)})x^{(i)}_{j} + \\frac{\\lambda}{m}\\theta_{j}$$ \n",
    "#### 向量化的偏导(梯度)\n",
    "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m} X^T(g(X\\theta)-y) + \\frac{\\lambda}{m}\\theta_{j}$$\n",
    "##### $$\\text{注意，我们另外自己加的参数 } \\theta_{0} \\text{ 不需要被正则化}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def gradientReg(theta, reg, *args):\n",
    "    m = y.size\n",
    "    h = sigmoid(XX.dot(theta.reshape(-1,1)))\n",
    "      \n",
    "    grad = (1.0/m)*XX.T.dot(h-y) + (reg/m)*np.r_[[[0]],theta[1:].reshape(-1,1)]\n",
    "        \n",
    "    return(grad.flatten())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.69314718055994529"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "initial_theta = np.zeros(XX.shape[1])\n",
    "costFunctionReg(initial_theta, 1, XX, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+wAAAFRCAYAAADuEicKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdcleX/x/HXAWQIIu6FM7egOXHgwIWKuMqBMzNTM0vT\nsqVZaZn1VSsz9GvDlbnLVebKPcmBOL9u3IqiHEHW9fuDHyeQeQ5n83k+HjyUe53rPhze3Nd1X/d1\naZRSCiGEEEIIIYQQQlgVB0sXQAghhBBCCCGEEBlJhV0IIYQQQgghhLBCUmEXQgghhBBCCCGskFTY\nhRBCCCGEEEIIKyQVdiGEEEIIIYQQwgpJhV0IIYQQQgghhLBCUmE3wNSpU+nRowc9evTAx8eHzp07\n06NHD3r27El8fHyuj7N9+3amTZtmwpJav1mzZhEYGEi3bt345JNPMrx/Z86cwd/fP8v9Y2JiqFu3\nLj179tR9HTp0CIBNmzbRrVs3unfvzksvvcSVK1cAePjwIQMHDqRbt258//33umMdOXKEiRMn5ul8\nPvzwQ/bv3w/ApEmTOHXqFACDBg3ir7/+ynH/9957j59++ilPZcjKnDlzmDJlSq62rV+/Pjdu3DBJ\nOaKiohg+fDhBQUEEBwdz9OjRPG0nbIPkpvEsXbqUoKAgunfvzujRo3n48CEAN2/eZNiwYXTv3p3g\n4GB+++23TPePi4tj/PjxdOnShc6dO7N161bduiVLluDv76/L04EDBwKSm7lhytxMtWfPHnr06JHl\neslN2yUZaTyHDx+mb9++dO/enUGDBnHt2rV063O6tswuI3fv3s0LL7xAz5496dWrF3v27AEkI3PD\nUhn5999/061bNzp37szYsWPRarUAJCcnM23aNDp37kxgYCC//vprpsfM7XYmpUSetG3bVkVERFi6\nGDZp1apVqmfPnkqr1SqllJo2bZqaPn26UkqpxMRE9dNPP6nmzZur+vXrZ3mM3bt3q5dffjnD8nv3\n7qkmTZqoW7duKaWUWrJkiRo2bJhSSqlFixap+fPnK6WUCgoKUjExMSopKUn1799f3bt3z2jnFxAQ\noE6ePKmUUmrgwIFq8+bNOe7z7rvvqh9//NFoZUjr22+/VR999FGutq1fv766fv26Scrx5ptvqnnz\n5imllDp9+rRq2bKliouLM3g7YXskNw13+fJl1aRJExUdHa2UUmrq1Knqk08+UUopNXLkSLVo0SKl\nVEoGNmjQQJeBac2YMUNNmjRJKaXUjRs3lL+/v267t956S23YsCHDPpKbOTNlbsbFxalZs2apRo0a\nqa5du2a5neSmfZCMNNytW7dUkyZN1OnTp5VSKdmVep2Y22vLrDLy8ePHqkmTJup///ufUkqpM2fO\nqEaNGimtVisZmQuWyMj79++rZs2aqatXryqllPryyy/VlClTlFIpdYNXX31VJScnq+joaNWpUyd1\n4sSJDMdeunRprrYzJbnDnkdKKZRS6Zb5+voyduxYOnfuTEREBKtWraJPnz706tWLtm3b6lpm1q5d\ny8iRI4GUVrKZM2cycOBA2rZtyzvvvJPp6x07doyBAwfSt29f2rZty4cffqhbt2PHDnr06EH37t3p\n168fZ86cyXL59evXqV+/vm7ftN+vXbuWAQMG0KtXL4YMGUJsbCwTJ06kX79+dOrUiRdeeIHLly8D\ncO/ePUaPHk3nzp3p2rUrixcv5ubNmzRo0ICYmBjd8QMDAzl79my6czl16hTt2rWjYMGCAHTo0EHX\nUhgREcG5c+f45ptvsn3/jx49ysOHD+nfvz89e/Zk2bJlABQrVox9+/ZRqlQpEhMTuX79Ol5eXgA4\nOzsTFxdHQkICSUlJODo6smzZMtq1a0exYsUyfZ3k5GSaNWuma6WdP38+bdu21a1/+eWX2blzp661\nc9asWdy5c4cJEyZw4sQJALZu3Urv3r1p27YtH3zwQbbnlZnQ0FB69+5N9+7d6dixo67Fd86cObzz\nzjv069ePdu3aMW7cOFatWsXAgQMJCAhg06ZNumNcvHiRQYMGERwczMSJE3ny5AmQ0gLco0cPevXq\nxaRJk3SfaaUUU6dOpW/fvnTt2pWgoKBM79js379fdycg7dfevXvTbZeUlMTff/9N7969AahZsyaV\nKlVi9+7dBm0nbJPkpuG56eLigkaj4fHjxyQnJxMXF4ezszMA33//ve6O+PXr13FycsLV1TXD+7F1\n61b69OkDQJkyZfD39+ePP/4AUjJ1/fr19OzZk1deeYVz584BkpuWzE1IuasXFxfH559/nuW5Sm7a\nD8lIwzPyzz//pHXr1tSsWROAvn376rIjt9eWWWVkYmIiU6ZM4bnnngOgatWqADx48EAy0kozcu/e\nvdStW5fy5csDEBISwoYNGwDYtm0bvXr1QqPR4OnpSVBQEOvWrctw7K1bt+ZqO5Mya/OAHUrb0pWq\nRo0aat26dUoppbRarerbt696+PChUkqpY8eO6Vr11qxZo0aMGKGUSmklGzt2rFJKqZiYGNWyZUt1\n8ODBDK/31ltvqUOHDumO3bRpUxUREaHu3bunGjVqpM6cOaOUUuqvv/5Sw4cPz3J5ZGRkutbFtN+v\nWbNGNWnSRHfn+88//1RTp07VbTt58mT16aefKqWUGj16tPryyy+VUko9fvxYde3aVV29elWNHj1a\n/fLLL0oppfbt26f69u2b4VzWrl2revXqpR48eKCSkpLU5MmTla+vb7ptni3ns+bOnavmzJmjkpOT\n1a1bt1THjh3V1q1bdevDw8NVixYtVKNGjdSxY8eUUko9efJEjRkzRvXs2VOtWLFCRUVFqX79+qnE\nxMQsX0cppd5//321ZMkSpVTKz8vf319dvnxZPX78WDVr1kwlJCSka+0MCAjQtZAPHDhQjR49Wiml\nVGxsrPL391dHjhzJ8BpZtYJev35dDRkyRD19+lQppdTGjRtVcHCwUiqldbNdu3YqJiZGxcXFqSZN\nmuh6KmzdulUFBgbqtgsICFAPHjxQSik1YcIE9dVXX6n4+HjVokULdeDAAaWUUn/88YeqWbOmun79\nujp69Kh68803deWYN2+eGjlyZLbvU3bu3r2r6tatm27ZhAkT1OLFiw3aTtgmyU3Dc1MppebMmaN8\nfHxUixYtVGBgoO59SjVo0CBVp04d3Ws8y9fXN90dn1mzZqnp06erJ0+eqGHDhumyctOmTapVq1bq\nyZMnkpsWzM20Dh48mOUddslN+yEZaXhGTpkyRU2aNEmNGzdO9ejRQ7322mu6u6uZlSszWWXks/7z\nn/+oF198USkl15bWmpHz5s1L1wMgMTFR1axZU8XExKhOnTqp48eP69atWLFCjRkzJsMxc7udKTmZ\nt3kg/2jYsCEABQsWJDQ0lB07dnDlyhVOnz5NbGxspvsEBAQA4O7uTsWKFYmOjs6wzfTp09m5cyfz\n5s3j4sWLxMXF8eTJE/755x+qV69OjRo1gJS71R06dGDLli2ZLr9+/Xq25a9Ro4buzndgYCDly5dn\nyZIlXLlyhUOHDulaTPfv3697NsfDw4P169cD0L9/f7766itCQkJYsWIFISEhGV6jR48e3Lx5k8GD\nB1OoUCGCg4N1rV65NWrUKN3/S5UqRb9+/di6dSvt2rUDwMfHhz179rB7925effVVtm3bhoeHR7rW\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1156cfe50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(1,3, sharey = True, figsize=(17,5))\n",
    "\n",
    "# 决策边界，咱们分别来看看正则化系数lambda太大太小分别会出现什么情况\n",
    "# Lambda = 0 : 就是没有正则化，这样的话，就过拟合咯\n",
    "# Lambda = 1 : 这才是正确的打开方式\n",
    "# Lambda = 100 : 卧槽，正则化项太激进，导致基本就没拟合出决策边界\n",
    "\n",
    "for i, C in enumerate([0.0, 1.0, 100.0]):\n",
    "    # 最优化 costFunctionReg\n",
    "    res2 = minimize(costFunctionReg, initial_theta, args=(C, XX, y), jac=gradientReg, options={'maxiter':3000})\n",
    "    \n",
    "    # 准确率\n",
    "    accuracy = 100.0*sum(predict(res2.x, XX) == y.ravel())/y.size    \n",
    "\n",
    "    # 对X,y的散列绘图\n",
    "    plotData(data2, 'Microchip Test 1', 'Microchip Test 2', 'y = 1', 'y = 0', axes.flatten()[i])\n",
    "    \n",
    "    # 画出决策边界\n",
    "    x1_min, x1_max = X[:,0].min(), X[:,0].max(),\n",
    "    x2_min, x2_max = X[:,1].min(), X[:,1].max(),\n",
    "    xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))\n",
    "    h = sigmoid(poly.fit_transform(np.c_[xx1.ravel(), xx2.ravel()]).dot(res2.x))\n",
    "    h = h.reshape(xx1.shape)\n",
    "    axes.flatten()[i].contour(xx1, xx2, h, [0.5], linewidths=1, colors='g');       \n",
    "    axes.flatten()[i].set_title('Train accuracy {}% with Lambda = {}'.format(np.round(accuracy, decimals=2), C))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
